package br.com.datasun.biblioteca.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.datasun.biblioteca.dao.factory.ConnectionFactory;
import br.com.datasun.biblioteca.entities.Cidade;
import br.com.datasun.biblioteca.entities.Estado;
import br.com.datasun.biblioteca.exceptions.DAOException;

public class CidadeDAO {
	
	public List<Cidade> listar() throws DAOException{
		List<Cidade> resultado = new ArrayList<Cidade>();
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" select c.id id_cidade ");
		sql.append("       ,c.nome nome_cidade ");
		sql.append("       ,e.id id_estado ");
		sql.append("       ,e.nome nome_estado ");
		sql.append("   from cidade c ");
		sql.append("       ,estado e ");
		sql.append("   where c.id_estado = e.id ");
		sql.append("   order by e.id, c.id");
		
		try{
			//Se conecta ao banco de dados
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			
			//Consulta ao banco
			resultSet = preparedStatement.executeQuery();
			
			while (resultSet.next()) {
				Estado estado = new Estado();
				Cidade cidade = new Cidade();
				
				estado.setId(resultSet.getLong("id_estado"));
				estado.setNome(resultSet.getString("nome_estado"));
				
				cidade.setId(resultSet.getLong("id_cidade"));
				cidade.setNome(resultSet.getString("nome_cidade"));
				cidade.setEstado(estado);
				
				resultado.add(cidade);
			}			
			
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		} return resultado;
		
	}
	
	public Cidade getCidadeById(long id) throws DAOException{
		Cidade resultado = new Cidade();
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" select c.id id_cidade ");
		sql.append("       ,c.nome nome_cidade ");
		sql.append("       ,e.id id_estado ");
		sql.append("       ,e.nome nome_estado ");
		sql.append("   from cidade c ");
		sql.append("       ,estado e ");
		sql.append("   where c.id_estado = e.id ");
		sql.append("     and c.id = ?");
		sql.append("   order by e.id, c.id");
		
		try{
			//Se conecta ao banco de dados
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setLong(1, id);
			
			//Consulta ao banco
			resultSet = preparedStatement.executeQuery();
			
			while (resultSet.next()) {
				Estado estado = new Estado();
					
				estado.setId(resultSet.getLong("id_estado"));
				estado.setNome(resultSet.getString("nome_estado"));
				
				resultado.setId(resultSet.getLong("id_cidade"));
				resultado.setNome(resultSet.getString("nome_cidade"));
				resultado.setEstado(estado);
							
			}			
			
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		} return resultado;
		
	}
	
	public List<Cidade> listarTodasCidadesDoEstado(Estado estado) throws DAOException{
		List<Cidade> resultado = new ArrayList<Cidade>();
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" select c.id id_cidade ");
		sql.append("       ,c.nome nome_cidade ");
		sql.append("       ,e.id id_estado ");
		sql.append("       ,e.nome nome_estado ");
		sql.append("   from cidade c ");
		sql.append("       ,estado e ");
		sql.append("   where c.id_estado = e.id ");
		sql.append("     and c.id_estado = ? ");
		sql.append("   order by e.id, c.id");
		
		try{
			//Se conecta ao banco de dados
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setLong(1, estado.getId());
			
			//Consulta ao banco
			resultSet = preparedStatement.executeQuery();
			
			while (resultSet.next()) {				
				Cidade cidade = new Cidade();										
				cidade.setId(resultSet.getLong("id_cidade"));
				cidade.setNome(resultSet.getString("nome_cidade"));
				cidade.setEstado(estado);
				
				resultado.add(cidade);
			}			
			
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		} return resultado;
		
	}

}
